package com.i5.distributedlock.annotation;

import com.i5.distributedlock.enumeration.LockType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

/**
 * 锁的注解 (使用Redis作为分布式锁)
 *
 * @author mc0710
 */
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD})
public @interface Lock {
    /**
     * 锁类型
     *
     * @return
     */
    LockType lockType() default LockType.REENTRANT;

    /**
     * 加锁时间，,超过该时长自动解锁，默认单位为：秒
     *
     * @return
     */
    long leaseTime() default -1;

    /**
     * 等待锁时间，超过该时长依然无法获取到锁则不会执行程序。默认单位：秒
     *
     * @return
     */
    long waitTime() default -1;

    /**
     * 锁时长单位
     *
     * @return
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * 自定义前缀，当不为空时，使用该前缀生成key值。全局锁，所以命名一定要规范不能重复，重复影响作用域
     *
     * @return 自定义前缀
     */
    String prefixName() default "";

    /**
     * 是否自动释放
     *
     * @return true 是，false 否
     */
    boolean automaticRelease() default true;
}
